package com.zt.service;

import com.zt.entity.Coupons;
import java.util.List;
import java.util.Map;

/**
 * 优惠券发放Redis服务接口
 * 按照指定格式实现优惠券发放和缓存
 */
public interface CouponDistributionRedisService {
    
    /**
     * 为新用户发放默认优惠券
     * @param userId 用户ID
     */
    void giveNewUserCoupon(Long userId);
    
    /**
     * 为用户发放指定优惠券
     * @param userId 用户ID
     * @param couponId 优惠券ID
     */
    void distributeCouponToUser(Long userId, Integer couponId);

    /**
     * 通用发放优惠券方法
     * 使用 couponRedisTemplate.opsForValue().set(couponsKey, couponsJson, NEW_USER_COUPON_TTL, TimeUnit.DAYS)
     * @param userId 用户ID
     * @param couponId 优惠券ID
     * @param source 发放来源
     */
    void distributeCouponWithRedisCache(Long userId, Integer couponId, String source);

    /**
     * 活动发放优惠券
     * @param userId 用户ID
     * @param couponId 优惠券ID
     * @param activityName 活动名称
     */
    void distributeActivityCoupon(Long userId, Integer couponId, String activityName);

    /**
     * 批量发放优惠券
     * @param userIds 用户ID列表
     * @param couponId 优惠券ID
     */
    void batchDistributeCoupons(List<Integer> userIds, Integer couponId);
    
    /**
     * 获取用户的优惠券缓存
     * @param userId 用户ID
     * @return 用户优惠券列表（Map格式）
     */
    List<Map<String, Object>> getUserCouponsFromCache(Long userId);
    
    /**
     * 删除用户优惠券缓存
     * @param userId 用户ID
     */
    void deleteUserCouponsCache(Long userId);

    /**
     * 查询所有发放的优惠券
     * @param userId 用户ID（可选，为null时查询所有用户）
     * @param status 优惠券状态（可选，为null时查询所有状态）1-未使用，2-已使用
     * @param couponId 优惠券ID（可选，为null时查询所有优惠券）
     * @return 发放的优惠券列表
     */
    List<Map<String, Object>> queryDistributedCoupons(Long userId, Integer status, Integer couponId);
}
